package com.hs.core.utils;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
 

public class HibernatePage extends BasePage {

	 /**
	 * 
	 */
	private static final long serialVersionUID = 7015627579157214541L;


	/** 
     * 构建HibernatePage对象，完成Hibernate的Query数据的分页处理 
     * 
     * @param query      Hibernate的Query对象 
     * @param pageNumber 当前页编码，从1开始，如果传的值为Integer.MAX_VALUE表示获取最后一页。 
     *                   如果你不知道最后一页编码，传Integer.MAX_VALUE即可。如果当前页超过总页数，也表示最后一页。 
     *                  �这两种情况将重新更�?当前页的页码，为最后一页编码。 
     * @param pageSize  ��?一页显示的条目数 
     */ 
    public HibernatePage(Query query, int pageNumber, int pageSize) 
    { 
    
        super(pageNumber,pageSize); 

        try 
        { 
            ScrollableResults scrollableResults = query.scroll(); 
            //System.out.println("=:"+query.getQueryString());
        	//System.out.println("===:2");
            //get the total elements number 
            scrollableResults.last(); 
        	//System.out.println("===:3:" +  this.totalElements);
//        	if(!query.list().isEmpty()){   
//        		this.totalElements = (Integer) query.list().get(0);   
//        	}
        	//System.out.println("this.totalElements:" + this.totalElements);
            this.totalElements = scrollableResults.getRowNumber()+1;  //因为是和jdbc中的index对应的,第一个是0.所以这里+1
            recomputePageNumber(); 
        	//System.out.println("===:" + this.pageNumber);
        	//System.out.println("===:" + this.pageSize);

            elements = query.setFirstResult((this.pageNumber - 1) * this.pageSize).setMaxResults(this.pageSize).list();
            
            System.out.println("totalElements===="+this.totalElements);
        } catch (HibernateException e) 
        { 
            throw new RuntimeException(e); 
        } 
    } 
    
    /** 
     * 构建HibernatePage对象，完成Hibernate的Query数据的分页处理 
     * 
     * @param selectQuery              Hibernate的查询Query对象 
     * @param countQuery                Hibernate的查询总数据行数的Query对象 
     * @param pageNumber 当前页编码，从1开始，如果传的值为Integer.MAX_VALUE表示获取最后一页。 
     *                   如果你不知道最后一页编码，传Integer.MAX_VALUE即可。如果当前页超过总页数，也表示最后一页。 
     *                  �这两种情况将重新更�?当前页的页码，为最后一页编码。 
     * @param pageSize  ��?一页显示的条目数 
     */ 
    public HibernatePage(Query selectQuery, Query countQuery,int pageNumber, int pageSize) 
    { 
        super(pageNumber,pageSize); 
        try 
        { 
            //得到总记录数 
            this.totalElements = ((Long)countQuery.setMaxResults(1).uniqueResult()).intValue();  //因为是和jdbc中的index对应的,第一个是0.所以这里+1
            recomputePageNumber(); 
            elements = selectQuery 
                    .setFirstResult((this.pageNumber - 1) * this.pageSize) 
                    .setMaxResults(this.pageSize) 
                    .list(); 
            
           
        } catch (HibernateException e) 
        { 
            throw new RuntimeException(e); 
        } 
    } 
    
    
    /**
     * 
     * @param criteria
     * @param pageNumber
     * @param pageSize
     */
    public HibernatePage(Criteria criteria,int pageNumber, int pageSize) { 
        super(pageNumber,pageSize); 
        //得到总记录数 
        ScrollableResults scrollableResults = criteria.scroll(); 
        scrollableResults.last(); 
        this.totalElements = scrollableResults.getRowNumber()+1;  //因为是和jdbc中的index对应的,第一个是0.所以这里+1 
        
        recomputePageNumber(); 
        elements = criteria 
                .setFirstResult((this.pageNumber - 1) * this.pageSize) 
                .setMaxResults(this.pageSize + 1).list(); 
} 


}
